<?php

/**
 * Obiekt do obsługi danych wejściowych do aplikacji
 * 
 * Pozwala na stosowanie pluginów do obsługi różnego rodzaju danych, takich jak
 * POST, GET, pliki itd.
 *
 */
class Rapide_Request
{
	private $_aPlugins = array();

	/**
	 * Zwraca plugin o podanej nazwie
	 *
	 * @param string $sPlugin
	 * @return unknown obiekt pluginu
	 */
	public function __get($sPlugin)
	{
		$sClass = $this->_formatPluginName($sPlugin);

		$oAutoloader = Rapide_Autoloader::getInstance();

		if(!$oAutoloader->load($sClass))
		{
			$sError = sprintf('Plugin %s does not exist', $sPlugin);
			throw new Rapide_Request_Exception($sError);
		}

		if(!array_key_exists($sPlugin, $this->_aPlugins))
			$this->_aPlugins[$sPlugin] = new $sClass();

		return $this->_aPlugins[$sPlugin];
	}

	/**
	 * Inicjalizuje i zwraca plugin o podanej nazwie
	 * 
	 * Dzięki wywołaniu __call możliwe jest przekazanie parametrów inicjalizacycjnych
	 * do pluginu. Należy pamiętać, że parametry te zostają zapamiętane i późniejsze
	 * wywołanie pluginu za pomocą __get spowoduje użycie tych parametrów.
	 * 
	 * Do wyzerowania parametrów (przywrócenia domyślnych) należy skorzystać z metody
	 * __call przekazując jej jedynie nazwę pluginu.
	 * 
	 * Przykład:
	 * 
	 * <code>
	 * $oRequest = new Rapide_Request();
	 * 
	 * // inizjalizacja parametrami
	 * $oPost = $oRequest->Post(true, true, false);
	 * 
	 * // przywrócenie domyślnych parametrów
	 * $oPost = $oRequest->Post();
	 * </code
	 *
	 * @param string plugin
	 * @param array initialization parameters
	 * @return object plugin
	 */
	public function __call($sPlugin, array $aParameters)
	{
		$oPlugin = $this->$sPlugin;

		if(method_exists($oPlugin, 'init'))
		{
			call_user_func_array(array($oPlugin, 'init'), $aParameters);
		}

		return $oPlugin;
	}

	/**
	 * Formatuje nazwę pluginu
	 *
	 * @param string $sName nazwa pluginu
	 * @return string
	 */
	private function _formatPluginName($sName)
	{
		return 'Rapide_Request_Plugin_' . ucfirst($sName);
	}
}

?>